home *** CD-ROM | disk | FTP | other *** search
/ Linux Cubed Series 4: GNU Archives / Linux Cubed Series 4 - GNU Archives.iso / gnu / glibc-1.09 / glibc-1 / glibc-1.09.1 / sysdeps / mach / thread_state.h < prev    next >
Encoding:
C/C++ Source or Header  |  1994-09-04  |  2.8 KB  |  87 lines

  1. /* Generic definitions for dealing with Mach thread states.
  2. Copyright (C) 1994 Free Software Foundation, Inc.
  3. This file is part of the GNU C Library.
  4.  
  5. The GNU C Library is free software; you can redistribute it and/or
  6. modify it under the terms of the GNU Library General Public License as
  7. published by the Free Software Foundation; either version 2 of the
  8. License, or (at your option) any later version.
  9.  
  10. The GNU C Library is distributed in the hope that it will be useful,
  11. but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  13. Library General Public License for more details.
  14.  
  15. You should have received a copy of the GNU Library General Public
  16. License along with the GNU C Library; see the file COPYING.LIB.  If
  17. not, write to the Free Software Foundation, Inc., 675 Mass Ave,
  18. Cambridge, MA 02139, USA.  */
  19.  
  20.  
  21. /* Everything else is called `thread_state', but CMU's header file is
  22.    called `thread_status'.  Oh boy.  */
  23. #include <mach/thread_status.h>
  24.  
  25. /* The machine-dependent thread_state.h file can either define these
  26.    macros, or just define PC and SP to the register names.  */
  27.  
  28. #ifndef MACHINE_THREAD_STATE_SET_PC
  29. #define MACHINE_THREAD_STATE_SET_PC(ts, pc) \
  30.   ((ts)->PC = (unsigned long int) (pc))
  31. #endif
  32. #ifndef MACHINE_THREAD_STATE_SET_SP
  33. #ifdef STACK_GROWTH_UP
  34. #define MACHINE_THREAD_STATE_SET_SP(ts, stack, size) \
  35.   ((ts)->SP = (unsigned long int) (stack))
  36. #else
  37. #define MACHINE_THREAD_STATE_SET_SP(ts, stack, size) \
  38.   ((ts)->SP = (unsigned long int) (stack) + (size))
  39. #endif
  40. #endif
  41.  
  42. /* These functions are of use in machine-dependent signal trampoline
  43.    implementations.  */
  44.  
  45. #include <string.h>        /* size_t, memcpy */
  46. #include <mach/mach_interface.h> /* __thread_get_state */
  47.  
  48. static inline int
  49. machine_get_state (thread_t thread, struct machine_thread_all_state *state,
  50.            int flavor, void *stateptr, void *scpptr, size_t size)
  51. {
  52.   if (state->set & (1 << flavor))
  53.     {
  54.       /* Copy the saved state.  */
  55.       memcpy (scpptr, stateptr, size);
  56.       return 1;
  57.     }
  58.   else
  59.     {
  60.       /* Noone asked about this flavor of state before; fetch the state
  61.      directly from the kernel into the sigcontext.  */
  62.       unsigned int got = (size / sizeof (int));
  63.       return (! __thread_get_state (thread, flavor, scpptr, &got)
  64.           && got == (size / sizeof (int)));
  65.     }
  66. }
  67.  
  68. static inline int
  69. machine_get_basic_state (thread_t thread,
  70.              struct machine_thread_all_state *state)
  71. {
  72.   unsigned int count;
  73.  
  74.   if (state->set & (1 << MACHINE_THREAD_STATE_FLAVOR))
  75.     return 1;
  76.  
  77.   count = MACHINE_THREAD_STATE_COUNT;
  78.   if (__thread_get_state (thread, MACHINE_THREAD_STATE_FLAVOR,
  79.               (int *) &state->basic, &count) != KERN_SUCCESS ||
  80.       count != MACHINE_THREAD_STATE_COUNT)
  81.     /* What kind of thread?? */
  82.     return 0;            /* XXX */
  83.  
  84.   state->set |= 1 << MACHINE_THREAD_STATE_FLAVOR;
  85.   return 1;
  86. }
  87.